package org.cjlm;

import org.cjlm.config.ConfigLoader;
import org.cjlm.config.InstanceConfig;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MLocator {
    private static final Map<Class<?>, Object> INSTANCE_MAP = new HashMap<>();
    private static final String CONFIG_ENV = "Instance"; // 对应Instance.json

    static {
        // 加载所有配置
        List<InstanceConfig> configs = ConfigLoader.loadInstanceConfig(CONFIG_ENV);
        for (InstanceConfig config : configs) {
            try {
                Class<?> itfClass = Class.forName(config.getItf());
                Class<?> implClass = Class.forName(config.getImpl());
                // 在实例化后添加类型检查
                if (!itfClass.isAssignableFrom(implClass))  {
                    throw new ClassCastException(implClass.getName()  +
                            " 未实现接口 " + itfClass.getName());
                }
                // 关键：创建实例并缓存
                // 在MLocator中使用双重检查锁
                if (!INSTANCE_MAP.containsKey(itfClass))  {
                    synchronized (MLocator.class)  {
                        if (!INSTANCE_MAP.containsKey(itfClass))  {
                            // 创建实例
                            Object instance = implClass.getDeclaredConstructor().newInstance();
                            INSTANCE_MAP.put(itfClass,  instance);
                        }
                    }
                }

            } catch (Exception e) {
                throw new RuntimeException("初始化失败: " + config.getItf(),  e);
            }
        }
    }

    public static <T> T getInstance(Class<T> itfClass) {
        Object instance = INSTANCE_MAP.get(itfClass);
        if (instance == null) {
            throw new IllegalStateException("未找到实现: " + itfClass.getName());
        }
        return (T) instance; // 安全转型
    }
}
